﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using ApplicationGenerator.Versions.BusinessLogic;
using ApplicationGenerator.Versions.Forms;
using System.Drawing.Design;
using ApplicationGenerator.CommonModule;

namespace ApplicationGenerator.Lists.Web
{
    /// <summary>
    /// Akcja pozwalająca na dodanie elementu do listy
    /// </summary>
    [DefaultProperty("Form")]
    [Serializable]
    public class ListActionAddToList : ListActionBase
    {
        #region Properties
        /// <summary>
        /// Docelowy formularz, na który należy przejść w wyniku wykonania akcji
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Docelowy formularz")]
        [Description("Docelowy formularz, na który w wyniku wykonania akcji zostanie przeniesiony użytkownik")]
        [TypeConverter(typeof(VersionConverter))]
        [Editor(typeof(VersionEditor), typeof(UITypeEditor))]
        [VersionType(VersionElement.Form)]
        public VersionInfo Form
        {
            get;
            set;
        }

        /// <summary>
        /// Nazwa pola relacyjnego w elemencie docelowym
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Pole relacyjne")]
        [Description("Nazwa pola relacyjnego w docelowym modelu, wskazującym na listę elementu bazowego")]
        public string RelationPropertyName
        {
            get;
            set;
        }
        #endregion

        #region Overrides
        /// <summary>
        /// Wykonuje akcję
        /// </summary>
        public override void ExecuteAction()
        {
            if (string.IsNullOrEmpty(ListControl.Page.Request.QueryString[QuerryStringConstants.ElementId]))
            {
                ListControl.AddErrorMessage("Nie można pobrać id aktualnego elementu");
                return;
            }

            int elementId;
            if (!int.TryParse(ListControl.Page.Request.QueryString[QuerryStringConstants.ElementId], out elementId))
            {
                ListControl.AddErrorMessage("Id elementu ma nieprawidłowy format");
                return;
            }

            ListControl.Page.Response.Redirect(QuerryStringConstants.GenerateAddElementToListUrl(Form.Version.ToString(), elementId, RelationPropertyName));
        }

        /// <summary>
        /// Zwraca nazwę akcji
        /// </summary>
        /// <returns>Nazwa akcji</returns>
        public override string ToString()
        {
            return "Akcja dodaj element";
        }

        /// <summary>
        /// Waliduje encję
        /// </summary>
        /// <param name="errorList">Lista błędów</param>
        /// <returns>Czy encja jest poprawna ?</returns>
        public override bool IsValid(ErrorEntity errorList)
        {
            bool isValidated = base.IsValid(errorList);
            if (this.Form == null)
            {
                errorList.ErrorStrings.Add("Należy wybrać formularz do wyświetlenia");
                isValidated = false;
            }

            if (string.IsNullOrEmpty(this.RelationPropertyName))
            {
                errorList.ErrorStrings.Add("Należy podać nazwę pola relacyjnego");
                isValidated = false;
            }

            return isValidated;
        }

        #endregion

    }
}
